/*** Created Time: 2022年5月25日 14:34:34 ***/
/*** Author: Eric                        ***/

#ifndef _MY_MUTEX_H_
#define _MY_MUTEX_H_

#include <onix/types.h>
#include <onix/list.h>
#include <onix/task.h>

// 互斥量
typedef struct mutex_t
{
    bool value;     // 信号量
    list_t waiters; // 等待队列
} mutex_t;

void mutex_init(mutex_t *mutex);    // 初始化互斥量
void mutex_lock(mutex_t *mutex);    // 尝试持有互斥量
void mutex_unlock(mutex_t *mutex);  // 释放互斥量

// 互斥锁
typedef struct lock_t
{
    task_t *holder; // 持有者
    mutex_t mutex;  // 互斥量
    u32 repeat;     // 重入次数
} lock_t;

void lock_init(lock_t *lock);        // 锁初始化
void lock_acquire(lock_t *lock);     // 尝试持有锁
void lock_release(lock_t *lock);     // 释放锁

#endif